package 程序员面试金典;

/**
 * 面试题 01.05. 一次编辑
 * 字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串，编写一个函数判定它们是否只需要一次(或者零次)编辑。
 *
 *
 *
 * 示例 1:
 *
 * 输入:
 * first = "pale"
 * second = "ple"
 * 输出: True
 *
 *
 * 示例 2:
 *
 * 输入:
 * first = "pales"
 * second = "pal"
 * 输出: False
 */
public class T01_05 {
    public boolean oneEditAway(String first, String second) {
        if (first.equals(second)) {
            return true;
        }

        //相差两个字符 直接返回false
        if (Math.abs(first.length() - second.length()) >= 2) {
            return false;
        }

        char[] chars1 = first.toCharArray();
        char[] chars2 = second.toCharArray();

        int count = 0; //统计编辑次数
        int i = 0;
        int j = 0;
        while (i < chars1.length && j < chars2.length) {

            if (chars1[i] != chars2[j]) {
                if (chars1.length == chars2.length) { //进行一次修改
                    i++;
                    j++;
                } else { //进行一次删除
                    if (chars1.length > chars2.length) {
                        i++;
                    } else {
                        j++;
                    }
                }
                count++;  //编辑次数加1

            } else {

                i++;
                j++;
            }


        }


        return count <= 1;

    }

    public static void main(String[] args) {

        T01_05 t01_05 = new T01_05();
        t01_05.oneEditAway("mart", "karma");

    }
}
